package 集合.Collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;

public class collection {
    /*
       Collection集合体系结构
       分为  List  ， Set
       List：添加的元素是有序，可重复，有索引(ArrayList LinkedList Vector)
       Set： 添加的元素是无序，不重复，无索引（即存的顺序和取得顺序不相同）
       ( treeSet         HashSet-->LinkedHashSet)
*/
    public static void main(String[] args) {
//        Collection是单列结合的祖宗接口，它的功能是全部单列集合都可以集成使用
        /*
        public boolean add(E e)     将给定的对象添加到当前集合中
        public void clear()         清空集合中的所有元素
        public boolean remove(E e) 将给定的对象在当前集合中删除
        public boolean contains(object obj) 判断当前集合是否包含给定的对象
        public boolean isEmpty()   判断当前集合是否为空
        public int size()   返回集合中元素的个数/集合的长度

        注意 Collection是一个接口，不能直接创建对象，只能创建实现类的对象
        实现类： ArrayList

        */
//        注意Collection<>括号内为定义的对象名例如以下：
//        Collection<Students> 那么在写对象的时候也以  Students xx=new Students()的形式
        Collection<Students>  coll=new ArrayList<>();
        Students s1=new Students("zhangsan",18);
        Students s2=new Students("lisi",19);
        Students s3=new Students("wangwu",20);
        Students s4=new Students("wangwu",20);

//        1.添加元素
//        细节一：如果要往list系列集合中添加数据，那么方法用于返回true，
//               因为list集合允许数据重复，当不存在或者存在时，添加元素都会显示true
//        细节二：如果向set系列集合添加元素时，当元素不存在则会返回true，表示添加成功
//              如果元素存在，则会返回false因为set系列集合不允许数据重复，表示添加失败
        coll.add(s1);
        coll.add(s2);
        coll.add(s3);
//        即测试：内容一样但是没有添加
        System.out.println(coll.contains(s4));
//        contains方法在底层依赖equals方法，判断对象是否一致
//        如果存的是自定义属性，那么需要重写equals方法，那么默认使用Object类中的equals方法进行判断
//        而object类中的equals方法依赖地址值进行判断即：地址值不同，那么返回的是false
//        在类中重写equals方法（alt+insert）选择equals和hashCode()直接next，结束后比较的是属性值不是地址值


    }
}


class Students{
private String name;
private int age;


    public Students() {
    }

    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Students students = (Students) o;
        return age == students.age && Objects.equals(name, students.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Students{name = " + name + ", age = " + age + "}";
    }
}

